﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Common;
using DataLayer;
using System.Data;
using System.Security.Cryptography;

namespace BusinessLayer
{
    public static class BizUser
    {
        public static dsBoleto LoadUser(int Id)
        {
            DatUser.GetUsuarioAndRoles(Id);
            RemoveUnselectedRoles();
            ///Tratamiento de Util.DSBoleto
            ///para que no traiga elementos indeseados
            ///y traiga los deseados.
            return Util.DSBoleto;
        }
        public static dsBoleto LoadUserWithUnselectedRoles(int Id)
        {
            DatUser.GetUsuarioAndRoles(Id);
            RemoveSelectedRoles();
            ///Tratamiento de Util.DSBoleto
            ///para que no traiga elementos indeseados
            ///y traiga los deseados.
            return Util.DSBoleto;
        }

        private static void RemoveUnselectedRoles()
        {
            bool removeUnselected = true;
            RemoveRol(removeUnselected);
        }

        private static void RemoveRol(bool removeUnselected)
        {
            List<dsBoleto.RolRow> drl = new List<dsBoleto.RolRow>();
            foreach (dsBoleto.RolRow r in Util.DSBoleto.Rol.Rows)
            {
                if (removeUnselected)
                {
                    if (!Util.DSBoleto.Usuario_X_Rol.Any(ur => ur.IdRol == r.IdRol))
                        drl.Add(r);
                }
                else
                {
                    if (Util.DSBoleto.Usuario_X_Rol.Any(ur => ur.IdRol == r.IdRol))
                        drl.Add(r);
                }

            }
            drl.ForEach(Util.DSBoleto.Rol.RemoveRolRow);
        }
        private static void RemoveSelectedRoles()
        {
            bool removeUnselected = false;
            RemoveRol(removeUnselected);
        }


        public static dsBoleto LoadUsers(string UsernameLike, List<int> Roles, bool SoloHabilitados)
        {
            DatUser.GetUsuarios(UsernameLike, Roles, SoloHabilitados);
            ///Tratamiento de Util.DSBoleto
            ///para que no traiga elementos indeseados
            return Util.DSBoleto;
        }

        public static dsBoleto LoadUsers(string UsernameLike, bool SoloHabilitados)
        {
            DatUser.GetUsuarios(UsernameLike, new List<int>(), SoloHabilitados);
            ///Tratamiento de Util.DSBoleto
            ///para que no traiga elementos indeseados
            return Util.DSBoleto;
        }

        public static dsBoleto LoadUsers()
        {
            DatUser.GetUsuarios(string.Empty, new List<int>(), true);
            ///Tratamiento de Util.DSBoleto
            ///para que no traiga elementos indeseados
            return Util.DSBoleto;
        }

        public static void InsertUser(string UserName, List<int> Roles)
        {
            //TODO: Modificar el Password para que esté hasheado con SHA256

            int IdNewUsuario = DatUser.NewUsuario(UserName, Util.HashPassword(UserName));
            DatUser.NewUsuarioRoles(IdNewUsuario, Roles);
        }

        /// <summary>
        /// Realiza la baja logica del usuario.
        /// </summary>
        /// <param name="Id"></param>
        public static void DeleteUser(int Id)
        {
            ///La baja logica es de negocio. Asi que se resuelve acá, 
            ///y se manda como un update fisico a la capa de datos.-
            List<Util.DBParameter> MisParams = new List<Util.DBParameter>();
            Util.DBParameter MyId, MyIsActive;
            MyId.dbType = System.Data.DbType.Int32;
            MyId.parameterName = "@Id";
            MyId.value = Id;

            MisParams.Add(MyId);

            MyIsActive.dbType = System.Data.DbType.Boolean;
            MyIsActive.parameterName = "@Active";
            MyIsActive.value = false;

            MisParams.Add(MyIsActive);

            DatUser.UpdateUsuario(MisParams);
        }

        public static void UpdateUser(int Id, bool RegenPasswd, List<int> NewRoles)
        {
            UpdateUser(Id, RegenPasswd);
            UpdateUser(Id, NewRoles);
        }

        public static int GetUserId(string Username)
        {
            return DatAdmin.GetUsuarioId(Username);
        }
        
        private static void UpdateUser(int Id, List<int> NewRoles)
        {
            ///La baja logica es de negocio. Asi que se resuelve acá, 
            ///y se manda como un update fisico a la capa de datos.-
            List<Util.DBParameter> MisParams = new List<Util.DBParameter>();
            Util.DBParameter MyId;
            MyId.dbType = System.Data.DbType.Int32;
            MyId.parameterName = "@Id";
            MyId.value = Id;

            MisParams.Add(MyId);
            DatUser.DeleteUsuarioRoles(Id);
            DatUser.NewUsuarioRoles(Id, NewRoles);


        }

        private static void UpdateUser(int Id, bool RegenPasswd)
        {
            if (RegenPasswd)
            {
                dsBoleto ds = LoadUser(Id);
                string pass = ds.Usuario[0].Username;
                List<Util.DBParameter> misParams = new List<Util.DBParameter>();
                Util.DBParameter pId, pPass;
                pId.dbType = System.Data.DbType.Int32;
                pId.parameterName = "@Id";
                pId.value = Id;
                misParams.Add(pId);

                pPass.dbType = System.Data.DbType.String;
                pPass.parameterName = "@Pass";
                pPass.value = Util.HashPassword(pass);
                misParams.Add(pPass);

                DatUser.UpdateUsuario(misParams);
            }
        }

        internal static void UpdateUser(int Id, string newPassword)
        {
            List<Util.DBParameter> misParams = new List<Util.DBParameter>();
            Util.DBParameter pId, pPass;
            pId.dbType = System.Data.DbType.Int32;
            pId.parameterName = "@Id";
            pId.value = Id;
            misParams.Add(pId);

            pPass.dbType = System.Data.DbType.String;
            pPass.parameterName = "@Pass";
            pPass.value = Util.HashPassword(newPassword);
            misParams.Add(pPass);

            DatUser.UpdateUsuario(misParams);
        }
    }
}
